<?php

/**
 * This is the model class for table "configuracion".
 *
 * The followings are the available columns in table 'configuracion':
 * @property integer $id
 * @property string $ficheroppal
 * @property string $fecha_lectura
 * @property string $fecha_grabacion
 *
 * The followings are the available model relations:
 * @property FicheroCfg[] $ficheroCfgs
 * @property Variables[] $Variables
 */
class Configuracion extends CActiveRecord
{
        //AVG para que muestre por defecto la lista de configuraciones actuales
        public $defaultAction='index';

	/**
	 * Returns the static model of the specified AR class.
	 * @return Configuracion the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'configuracion';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
                    // array('id, ficheroppal', 'required'),
                    array('ficheroppal', 'required'),
                    array('ficheroppal', 'existe'),
                    array('fecha_lectura, fecha_grabacion', 'safe'),
                    // The following rule is used by search().
                    // Please remove those attributes that should not be searched.
                    array('ficheroppal, fecha_lectura, fecha_grabacion', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'ficheroCfgs' => array(self::HAS_MANY, 'FicheroCfg', 'configuracion_id'),
			'Variables' => array(self::HAS_MANY, 'Variables', 'configuracion_id'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'ficheroppal' => 'Fichero nagios.cfg',
			'fecha_lectura' => 'Fecha de Lectura',
			'fecha_grabacion' => 'Fecha de Grabacion',
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('ficheroppal',$this->ficheroppal,true);
		$criteria->compare('fecha_lectura',$this->fecha_lectura,true);
		$criteria->compare('fecha_grabacion',$this->fecha_grabacion,true);

		return new CActiveDataProvider(get_class($this), array(
			'criteria'=>$criteria,
		));
	}

        public function existe($attribute,$params){
            $datos=pathinfo($this->ficheroppal);
            // fichero no es legible
            if((!file_exists($this->ficheroppal)) || (!is_file($this->ficheroppal))) {
                $this->addError('ficheroppal','Fichero '.$datos['filename'].' no existe o no es legible.');
            }
            // extension no es cfg
          
            if ($datos['extension']!='cfg')
                $this->addError('ficheroppal','Sólo ficheros .cfg');

        }


        /**
         * procesaFichero()
         * Abre el fichero que venga como propiedad del objeto Configuracion
         * en 'ficheroppal' y carga las variabes en objetos Variable que
         * añade al objeto Configuracion actual
         *
         * @return bool (true si lo consigue)
         */
        public function procesaFichero(){
            Yii::log('Entro en procesaFichero','trace');
            try {
                $fi = fopen($this->ficheroppal, 'r');

                if ($fi) {
                    while (($buffer = fgets($fi, 4096)) !== false) {
                        $buffer=trim($buffer);
                        if (strlen($buffer)==0){
                            continue;
                        }
                        if (substr($buffer,0,1)=="#") {
                            continue;
                        }
                        if (strpos($buffer,"=")) {
                            $arr=explode('=',$buffer);
                            if (sizeof($arr)==2) {
                            // crear variable
                                $var = new Variables();
                                $var->nombre=$arr[0];
                                $var->valor=$arr[1];

                                // añadirla al modelo
                                if (!$this->addVariable($var)){
                                    throw new Exception('No se puede añadir variable: '.$var->toString());
                                    continue;
                                }

                               
                                // aqui tengo que procesar los ficheros de configuracion
                                if (!$this->esFicheroCfg($var)) {
                                    throw new Exception('No se puede añadir ficheroCfg');
                                    continue;
                                }
                                // tambien puede ser un directorio con ficheros
                                if (!$this->esDirCfg($var)) {
                                    throw new Exception('No se puede añadir directorioCfg');
                                    continue;
                                }
                            }
                        } //strpos($buffer,"=")

                    }
                    if (!feof($fi)) {
                        echo "Error: fallo inesperado de fgets()\n";
                    }
                    fclose($fi);

                    // ya he recorrido el fichero
                    // ahora hay que procesar los ficheros de objetos
                    // hago las llamadas desde el controlador
                }
            return true;
            }
            catch (Exception $e)
            {
                Yii::log($e->getTraceAsString(),'error');
                $this->addError('ficheroppal','Error de lectura');
                return false;
            }

        }

        function addFicheroCfg($fcfg){
            return $fcfg->save();
        }

        function addVariable($var) {
            $var->configuracion_id=$this->id;
            return $var->save();
        }

        public function toString()
        {
            return $this->ficheroppal.': '.$this->fecha_lectura.': '.sizeOf($this->Variables);
        }

        public function esFicheroCfg($var) {
            $salida=true;
            if ($var->nombre == 'cfg_file') {
                    if (is_file($var->valor) && (findexts($var->valor) == ".cfg")) {
                        // es un fichero: hay que crear un modelo FicheroCfg
                        $salida=$this->creaFicheroCfg($var->valor);
                    }
            }
            return $salida;
        }

        function creaFicheroCfg($fich) {
            $fmodel = new FicheroCfg();
            $fmodel->configuracion_id = $this->id;
            $fmodel->fichero = $fich;
            return $this->addFicheroCfg($fmodel);
        }

        function esDirCfg($var) {
            $salida = true;
            if ($var->nombre == 'cfg_dir'){
                    if (is_dir($var->valor)) {
                        // es un directorio: hay que crear un modelo FicheroCfg
                        // para cada fichero cfg del directorio
                        if ($dh=opendir($var->valor)) {
                            while (($file=readdir($dh)) !== false){
                                if (is_file($file)) {
                                    if(findexts($file == ".cfg"))
                                        $salida=$this->creaFicheroCfg($var->valor);
                                } else if (is_dir($file)) {
                                    if (!esDirCfg($file)) {
                                     throw new Exception('No se puede añadir directorioCfg');
                                    }
                                }
                            }
                            closedir($dh);
                        }
                    }
            }
            return $salida;

        }

         function findexts ($filename)
         {
             $filename = strtolower($filename) ;
             $exts = split("[/\\.]", $filename) ;
             $n = count($exts)-1;
             $exts = $exts[$n];
             return $exts;
         }

         /**
          * Procesa los ficheros de objetos que se han subido y que están
          * en la tabla ficheros_cfg
          * @param <type> $id
          */
         public function procesaObjetos($id){
             $fmodel=new FicheroCfg();
             $ficheros=$fmodel->findAllByAttributes(array('configuracion_id'=>$id));
             print_r($ficheros);
         }

}